#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    // 1. 配置sigaction，忽略SIGCHLD信号
    struct sigaction sa;
    sa.sa_handler = SIG_IGN;  // 设置为忽略
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    if (sigaction(SIGCHLD, &sa, NULL) == -1) {
        perror("sigaction failed");
        exit(1);
    }

    // 2. fork子进程
    pid_t pid = fork();
    if (pid == -1) {
        perror("fork failed");
        exit(1);
    }

    if (pid == 0) {
        printf("子进程(PID: %d)运行并退出\n", getpid());
        exit(0);
    } else {
        // 父进程：休眠10秒，期间不调用wait()
        printf("父进程(PID: %d)休眠10秒,不处理子进程\n", getpid());
        sleep(10);

        // 3. 验证子进程是否为僵尸进程
        printf("父进程休眠结束，检查子进程状态：\n");
        // 尝试wait子进程（实际已被系统自动清理）
        pid_t wait_pid = waitpid(pid, NULL, WNOHANG);
        if (wait_pid == 0) {
            printf("子进程仍存在（可能是僵尸进程）\n");
        } else if (wait_pid == pid) {
            printf("子进程已被清理（无僵尸进程）\n");
        } else {
            printf("子进程不存在（已被系统自动回收）\n");
        }
    }

    return 0;
}



// void handler(int signum)
// {
//   printf("I am 17 signal\n");
// }
// int main()
// {
//   signal(17, handler);
//   pid_t id = fork();
//   if (id == 0)
//   {
//     int cnt = 0;
//     while (cnt < 5)
//     {
//       printf("i am child\n");
//       sleep(1);
//       cnt++;
//     }
//   }
//   else if (id > 0)
//   {
//     int ret = 0;
//     while (ret < 2)
//     {
//       printf("i am father\n");
//       ret++;
//       sleep(1);
//     }
//     pid_t rid = waitpid(id, nullptr, 0);
//     if (rid == id)
//     {
//       printf("process quit\n");
//     }
//   }

//   return 0;
// }

// volatile int flag=0;
// void handler(int signum)
// {
//   std::cout<<"I am 2 signal"<<std::endl;
//   flag=1;
// }

// int main()
// {
//   signal(2,handler);
//   while(!flag);
//   std::cout<<"process quit normal"<<std::endl;
//   return  0;
// }

// void handler(int signum)
// {
//   std::cout<<"捕捉到："<<signum<<"信号"<<std::endl;
// }

// int main()
// {
//   struct sigaction sa;
//   //绑定自定义处理函数
//   sa.sa_handler=handler;
//   //初始化
//   sigemptyset(&sa.sa_mask);
//   //无特殊标志，设为0
//   sa.sa_flags=0;
//   sigaction(2,&sa,nullptr);
//   while(true)
//   {
//     std::cout<<"I am running..."<<std::endl;
//     sleep(1);
//   }
//   return 0;
// }

// void PrintSig(sigset_t*set)
// {
//   for(int i=0;i<32;i++)
//   {
//     if(sigismember(set,i))
//     {
//       putchar('1');
//     }
//     else
//     {
//       putchar('0');
//     }
//   }
//   puts("");
// }

// int main()
// {
//   //定义信号集，并完成初始化
//   sigset_t s,y;
//   sigemptyset(&s);
//   //增加信号
//   sigaddset(&s,2);
//   //设置阻塞信号集，阻塞SIGINT信号
//   sigprocmask(SIG_BLOCK,&s,NULL);
//   // 获取未决信号集
//   while(true)
//   {
//     sigpending(&y);
//     PrintSig(&y);
//     sleep(1);
//   }
//   return 0;
// }

// int main()
// {
//   int a=10;
//   int b=0;
//   a/=b;

//   return 0;
// }

// int main()
// {
//   int count=15;
//   alarm(5);
//   for(;1;count++)
//   {
//     printf("count:%d",count);
//     // sleep(1);
//   }

//   return 0;
// }

// void myhandler(int num)
// {
//   printf("这是%d号信号\n",num);
// }

// int main()
// {
//   signal(11,myhandler);
//   int*p=NULL;
//   *p=100;
//   while(1)
//   {
//     sleep(2);
//   }

//   return 0;
// }

// int main()
// {
//     for(int i = 1; i <= 31; i++)
//     {
//         signal(i, myhandler);
//     }

//     while(true)
//     {
//         std::cout << "I am a crazy process : " << getpid() << std::endl;
//         sleep(1);
//     }
//   // signal(2,hander);
//   // while(true)
//   // {
//   //   printf("hello Linux\n");
//   //   sleep(1);
//   // }
//   return 0;
// }
